package de.fhin.mas.agents.manager.behaviours;

import jade.domain.FIPAAgentManagement.FailureException;
import jade.domain.FIPAAgentManagement.NotUnderstoodException;
import jade.domain.FIPAAgentManagement.RefuseException;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import jade.proto.AchieveREResponder;
import de.fhin.mas.MASEvents;
import de.fhin.mas.agents.manager.ManagerAgent;

/**
 * Ermöglicht es, per ACLMessage ein AbortAndGoto-Behaviour zur erzeugen.
 * <p>
 * Wird u.a. von den Tests benötigt.
 * <p>
 * Wenn möglich, sollte aber Methode initAbortAndGoto des Manager-Agenten
 * verwendet werden!
 * 
 * @author Ast
 * 
 */
public class ServeAbortAndGoto extends AchieveREResponder {
	private static final long serialVersionUID = 7731278896103009688L;
	private final ManagerAgent managerAgent;

	public ServeAbortAndGoto(ManagerAgent a) {
		// TODO: Auf Topic umstellen
		super(a, MessageTemplate.and(
				MessageTemplate.MatchConversationId("init_" + MASEvents.ABORT_AND_GO_TO.getName()), MessageTemplate
						.MatchPerformative(ACLMessage.REQUEST)));
		managerAgent = a;
	}

	@Override
	protected ACLMessage handleRequest(ACLMessage request) throws NotUnderstoodException, RefuseException {
		return super.handleRequest(request);
	}

	@Override
	protected ACLMessage prepareResultNotification(ACLMessage request, ACLMessage response) throws FailureException {
		managerAgent.initAbortAndGoto(null);
		return new ACLMessage(ACLMessage.INFORM);
	}
}
